// 定义包路径，用于组织Java类的命名空间
package com.itheima.branch;

// 定义一个名为SwitchDemo4的公开类，用于演示switch语句的注意事项
public class SwitchDemo4 {
    // 定义主方法，Java程序的入口点
    public static void main(String[] args) {
        // 目标：搞清楚switch的注意事项，穿透性的应用
        // 调用test1方法，演示switch支持的数据类型限制
        test1();
        // 调用test3方法，演示switch的穿透性应用
        test3();
    }

    // 1、表达式类型只能是byte、short、int、char，JDK5开始支持枚举，JDK7开始支持String、不支持double、float、long
    // 定义test1方法，用于演示switch支持的数据类型限制
    public static void test1() {
        // 以下代码被注释掉，因为switch不支持double类型
        // double a = 0.1 + 0.2;  // 定义double类型变量a
        // switch (a) {  // 错误：switch不支持double类型作为表达式
        //     case 0.3:  // 错误：不能使用double类型作为case值
        //         System.out.println("10.5");  // 输出信息
        //         break;  // 跳出switch语句
        //     case 10.8:  // 错误：不能使用double类型作为case值
        //         System.out.println("10");  // 输出信息
        //         break;  // 跳出switch语句
        //     default:  // 当所有case都不匹配时执行
        //         System.out.println("default");  // 输出信息
        // }
    }

    // 2、case给出的值不允许重复，且只能是字面量，不能是变量
    // 定义test2方法，用于演示case值的规则
    public static void test2() {
        // 定义int类型变量a并赋值为10
        int a = 10;
        // 定义int类型变量b并赋值为15
        int b = 15;
        // 根据变量a的值执行不同的case分支
        switch (a) {
            // 当a等于10时执行以下代码
            case 10:
                // 输出字符串"10"
                System.out.println("10");
                // 跳出switch语句，防止穿透到下一个case
                break;
            // 当a等于15时执行以下代码
            case 15:
                // 输出字符串"10"
                System.out.println("10");
                // 跳出switch语句
                break;
            // 当所有case都不匹配时执行
            default:
                // 输出字符串"default"
                System.out.println("default");
        }
    }


    // 3、正常使用switch的时候，不要忘记写break，否则会出现穿透现象
    // 穿透性的作用：相同程序逻辑的case块，可以通过穿透性进行合并，从而减少重复代码的书写
    // 周一：埋头苦干，解决bug              周五：自己整理代码
    // 周二：请求大牛程序员帮忙              周六：打游戏
    // 周三：请求大牛程序员帮忙              周日：打游戏
    // 周四：请求大牛程序员帮忙
    // 定义test3方法，用于演示switch的穿透性应用
    public static void test3() {
        // 定义String类型变量week并赋值为"周六"
        String week = "周六";
        // 根据week的值执行不同的case分支
        switch (week) {
            // 当week等于"周一"时执行以下代码
            case "周一":
                // 输出"埋头苦干，解决bug"
                System.out.println("埋头苦干，解决bug");
                // 跳出switch语句
                break;
            // 当week等于"周二"时，由于没有break，会穿透到下一个case
            case "周二":
            // 当week等于"周二"或"周三"时，由于没有break，会穿透到下一个case
            case "周三":
            // 当week等于"周二"、"周三"或"周四"时执行以下代码
            case "周四":
                // 输出"请求大牛程序员帮忙"
                System.out.println("请求大牛程序员帮忙");
                // 跳出switch语句
                break;
            // 当week等于"周五"时执行以下代码
            case "周五":
                // 输出"自己整理代码"
                System.out.println("自己整理代码");
                // 跳出switch语句
                break;
            // 当week等于"周六"时，由于没有break，会穿透到下一个case
            case "周六":
            // 当week等于"周六"或"周日"时执行以下代码
            case "周日":
                // 输出"打游戏"
                System.out.println("打游戏");
                // 跳出switch语句
                break;
            // 当所有case都不匹配时执行
            default:
                // 输出"星期信息有误！"
                System.out.println("星期信息有误！");
        }
    }
}
